home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fritz: All Fritz
/
All Fritz.zip
/
All Fritz
/
FILES
/
PROGNG_C
/
CUTILV1.LZH
/
CC.C
< prev
next >
Wrap
Text File
|
1984-12-27
|
6KB
|
203 lines
/*
compile flow generator v1.0 for computer innovations c86
by Bob Lafleur and Tom Vaughan of Farm Credit Banks of Springfield
Comments are welcome! Contact:
Bob Lafleur
45 Ionia Street
Springfield, MA 01109
(413) 737-8503
CompuServe: 75146,3122
===============================================================
This program will accept a command line containing compiler switch(es)
and program name(s) and execute the four passes of the ci c86 compiler.
A list of files containing errors will appear at the end after all
programs have been compiled.
Note that this program uses the ANSI sequences to turn the bold
attribute on and off - if you're not using the ANSI driver, it is
a simple matter to remove them.
I keep my compiler in "c\exe", if yours is somewhere else, you'll
have to change the constants below.
===============================================================
If you come up with any additional enhancements/features for this,
please let me know!
*/
#include <stdio.h>
#define NODEBUG 1
main (argc, argv)
int argc;
char *argv[];
{
static char cc[4][80] =
{
{
"CC1 -i " /* -i (long identifiers) is standard! */
},
{
"CC2 "
},
{
"CC3 "
},
{
"CC4 "
}
};
char errlst[30][80];
int errcnt = 0;
static char *ccprg[] =
{
"C:\\EXE\\CC1.EXE", /* where the compiler is on disk */
"C:\\EXE\\CC2.EXE",
"C:\\EXE\\CC3.EXE",
"C:\\EXE\\CC4.EXE"
};
char fnam[30];
int phase; /* current phase number */
int cnt;
struct
{
unsigned int ax,
bx,
cx,
dx,
si,
di,
ds,
es; /* register struct */
} srv;
struct
{ /* param block structure */
int env_seg;
char *line_off,
*line_seg;
char *fcb1_off,
*fcb1_seg;
char *fcb2_off,
*fcb2_seg;
} ctrl;
unsigned char cline[128]; /* command line */
int status; /* status return variable */
int argcnt;
extern FILE * stdout;
#ifdef DEBUG
printf ("CCSML in DEBUG mode with %d arguments\n", argc);
#endif
if (argc < 2)
{
printf ("cc - ci c86 compile flow generator v1.0\n\n");
printf ("Usage: cc [-pa] [-pa]... [filename] [filename]...\n");
printf (" p - pass number (1, 2, 3, or 4)\n");
printf (" a - argument for pass p\n");
printf (" filename - name of file(s) to compile\n");
}
else
{ /* ONLY if given FILENAME */
for (argcnt = 1; argcnt < argc; argcnt++)
{
if (argv[argcnt][0] == '-')
{
int cl;
sscanf (&argv[argcnt][1], "%d", &cl);
cl--;
#ifdef DEBUG
printf ("Arg %d is %s\n", argcnt, argv[argcnt]);
#endif
strcat (cc[cl], "-");
strcat (cc[cl], &argv[argcnt][2]);
strcat (cc[cl], " ");
#ifdef DEBUG
printf ("cc line %d is now %s\n", cl + 1, cc[cl]);
#endif
}
}
for (argcnt = 1; argcnt < argc; argcnt++)
{
if (argv[argcnt]00] != '-')
{
sscanf (argv[argcnt], "%s", fnam);
/* edit the following line if you're not using the ANSI driver!!! */
fprintf (stdout, "\033[1m...compiling %s\033[0m\n", fnam);
status = 0; /* setup status */
for (phase = 0; phase < 4 && status == 0; phase++)
{
/*
*-- CREATE command line from FILENAME and COMMAND OPTIONS
*/
cline[0] = strlen (fnam) + strlen (cc[phase]);
cline[1] = 0;
strcat (cline, cc[phase]);
strcat (cline, fnam);
strcat (cline, "\r");
/*
*-- INSERT into the PARAM block
*/
segread (&srv.si);/* get segment address */
ctrl.env_seg = 0;/* NO environment */
ctrl.line_off = cline;/* setup command line */
ctrl.line_seg = srv.ds;/* segment for this */
#ifdef DEBUG
{
char temp[128];
printf ("Command line length = %u\n", cline[0]);
strncpy (temp, &cline[1], cline[0]-1);
temp[cline[0]] = 0;
printf ("Command line: %s\n", temp);
printf ("Filename: %s\n", ccprg[phase]);
}
#endif
status = loadexec (ccprg[phase], srv.ds, &ctrl, srv.ds, 0);
if (status == 0)/* check REAL status */
status = bdos (0x4d);
#ifdef DEBUG
printf ("LOADEXEC status: %d\n", status);
#endif
if (status) /* there was a compile error */
{
sprintf(errlst[errcnt++], "%s", fnam);
printf("\n");
}
}
}
}
if (errcnt) /* there was a compile error */
{
printf("\n\033[1mThere were errors in the file%s:\n", (errcnt != 1) ? "s" : "");
for (cnt = 0; cnt < errcnt; cnt++)
printf("%s\n", errlst[cnt]);
printf("\033[0m"); /* remove this if you're not using the ANSI driver */
}
}
}
/* END */